#include "time_impl.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos
{
    time_impl::time_impl()
    {
        memset( &m_tmval, 0, sizeof( m_tmval ) );
        memset( &m_tm, 0, sizeof( m_tm ) );
    }

    time_impl::~time_impl()
    {
        term();
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // 

    int time_impl::init()
    {
        int nRet = 0;
        return nRet;
    }

    int time_impl::term()
    {
        int nRet = 0;

        memset( &m_tmval, 0, sizeof( m_tmval ) );
        memset( &m_tm, 0, sizeof( m_tm ) );

        return nRet;
    }

    ////////////////////////////////////////////////////////////////////////////////////
    // 

    // 
    // calculate time difference. unit : 1 / 1000 second
    // 
    int time_impl::diffrent( i_time * pLastTime, xos_u32 * lpulDif )
    {
        int nRet = 0;

        time_impl * pImpl = static_cast< time_impl * >( pLastTime );

        if( !lpulDif || !pLastTime )
        {
            nRet = 1;
        }

        if( 0 == nRet )
        {
            xos_i32 l_s = ( int )( m_tmval.tv_sec - pImpl->m_tmval.tv_sec );
            xos_i32 l_us = ( int )( m_tmval.tv_usec - pImpl->m_tmval.tv_usec );

            *lpulDif = l_s * 1000 + l_us / 1000;
        }

        return nRet;
    }

    int time_impl::get_milli_second()
    {
        int nRet = m_tmval.tv_usec / 1000;
        return nRet;
    }

    // 
    // update time
    // 
    int time_impl::get_time()
    {
        int nRet = 0;
        gettimeofday( &m_tmval, 0 );
        memcpy( &m_tm, localtime( &m_tmval.tv_sec ), sizeof( struct tm ) );
        return nRet;
    }

    // 
    // get time details
    // 
    int time_impl::get_year()
    {
        int nRet = m_tm.tm_year + 1900;
        return nRet;
    }

    int time_impl::get_month()
    {
        int nRet = m_tm.tm_mon + 1;
        return nRet;
    }

    int time_impl::get_day()
    {
        int nRet = m_tm.tm_mday;
        return nRet;
    }

    int time_impl::get_hour()
    {
        int nRet = m_tm.tm_hour;
        return nRet;
    }

    int time_impl::get_minute()
    {
        int nRet = m_tm.tm_min;
        return nRet;
    }

    int time_impl::get_second()
    {
        int nRet = m_tm.tm_sec;
        return nRet;
    }

    // 
    // release
    // 
    int time_impl::release()
    {
        int nRet = 0;

        term();
        put_back_lock();

        return nRet;
    }
} // xos
